home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / WINPROGS / ECJDLL11.ZIP / EXAMPLE.ZIP / SHOWJPG.C < prev    next >
C/C++ Source or Header  |  1993-08-17  |  9KB  |  277 lines

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <commdlg.h>
  4. #include <stdlib.h>
  5. #include "showjpg.h"
  6. #include "ecjapi.h"
  7.  
  8. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  9.  
  10. HANDLE WINAPI ECJ_Decode (LPSTR, WORD, LONG, ECJCB) ;
  11. HPALETTE PASCAL NEAR MakeDIBPalette (LPBITMAPINFOHEADER) ;
  12.  
  13. long FAR PASCAL _export WndProc (HWND, UINT, UINT, LONG) ;
  14. int  FAR PASCAL _export ECJ_CallBack (WORD, WORD, LONG) ;
  15.  
  16. char     szAppName [] = "ShowJPG" ;
  17. HWND     hWnd ;
  18. HPALETTE holdpal = NULL, hPalette = NULL;
  19.  
  20. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  21.                     LPSTR lpszCmdLine, int nCmdShow)
  22.      {
  23.      MSG         msg ;
  24.      WNDCLASS    wndclass ;
  25.  
  26.      if (!hPrevInstance) 
  27.           {
  28.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  29.           wndclass.lpfnWndProc   = WndProc ;
  30.           wndclass.cbClsExtra    = 0 ;
  31.           wndclass.cbWndExtra    = 0 ;
  32.           wndclass.hInstance     = hInstance ;
  33.           wndclass.hIcon         = NULL ;
  34.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  35.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  36.           wndclass.lpszMenuName  = szAppName ;
  37.           wndclass.lpszClassName = szAppName ;
  38.  
  39.           RegisterClass (&wndclass) ;
  40.           }
  41.  
  42.      hWnd = CreateWindow (szAppName, "Show JPG using ECJ",
  43.                           WS_OVERLAPPEDWINDOW,
  44.                           CW_USEDEFAULT, CW_USEDEFAULT,
  45.                           CW_USEDEFAULT, CW_USEDEFAULT,
  46.                           NULL, NULL, hInstance, NULL) ;
  47.  
  48.      ShowWindow (hWnd, nCmdShow) ;
  49.      UpdateWindow (hWnd) ;
  50.  
  51.      while (GetMessage (&msg, NULL, 0, 0))
  52.           {
  53.           TranslateMessage (&msg) ;
  54.           DispatchMessage (&msg) ;
  55.           }
  56.      return msg.wParam ;
  57.      }
  58.  
  59.  
  60. BYTE huge * GetDibBits (LPBITMAPINFOHEADER lpbmih)
  61.      {
  62.      BYTE huge * pBits;
  63.      DWORD dwNumColors;
  64.  
  65.      dwNumColors = lpbmih->biClrUsed ;
  66.  
  67.      if (dwNumColors == 0)
  68.           if (lpbmih->biBitCount != 24)
  69.                dwNumColors = 1L << lpbmih->biBitCount ;
  70.  
  71.      pBits = (BYTE huge *) lpbmih + (DWORD)lpbmih->biSize +
  72.                dwNumColors * sizeof(RGBQUAD);
  73.      return pBits;
  74.      }
  75.  
  76. int FAR PASCAL _export ECJ_CallBack (WORD mMsg, WORD wParam, LONG lParam)
  77.      {
  78.      char whatsup[80];
  79.      switch (mMsg)
  80.           {
  81.           case ECJ_RESOLUTION: break;
  82.           case ECJ_PROGRESS:
  83.         switch (wParam)
  84.           {
  85.           case 0: wsprintf(whatsup, "%d%%", (int)lParam); break;
  86.           case 1: wsprintf(whatsup, "Making histogram"); break;
  87.           case 2: wsprintf(whatsup, "Remap %d%%", (int)lParam); break;
  88.           }
  89.         SetWindowText(hWnd, whatsup);
  90.         break;
  91.           case ECJ_ERROR: break;
  92.       }
  93.      return 0 ;
  94.      }
  95.  
  96. long FAR PASCAL _export WndProc (HWND hwnd, UINT message, UINT wParam,
  97.                                                           LONG lParam)
  98.      {
  99.      static char         szFileName  [_MAX_PATH],
  100.                          szTitleName [_MAX_FNAME + _MAX_EXT] ;
  101.      static char *       szFilter[] = { "JPG Files (*.jpg)","*.jpg","" } ;
  102.      static HANDLE     lpDib ;
  103.      LPBITMAPINFOHEADER  lpbi;
  104.      static OPENFILENAME ofn ;
  105.      static short        cxClient, cyClient ;
  106.      static WORD         wDisplay = IDM_ACTUAL ;
  107.      HDC                 hdc ;
  108.      HMENU               hMenu ;
  109.      BYTE huge *         lpDibBits ;
  110.      PAINTSTRUCT         ps ;
  111.      short               cxDib, cyDib ;
  112.  
  113.      static FARPROC     lpfnECJ_CallBack ;
  114.      static char     grey=0, half=0, auto_half=1, dither=0, two_pass=0 ;
  115.      static int         color_bits = 8 ;
  116.      static int         attrib ;
  117.  
  118.      switch (message)
  119.           {
  120.           case WM_CREATE:
  121.            {
  122.                 HANDLE     hInstance;
  123.                ofn.lStructSize       = sizeof (OPENFILENAME) ;
  124.                ofn.hwndOwner         = hwnd ;
  125.                ofn.lpstrFilter       = szFilter [0] ;
  126.                ofn.lpstrFile         = szFileName ;
  127.                ofn.nMaxFile          = _MAX_PATH ;
  128.                ofn.lpstrFileTitle    = szTitleName ;
  129.                ofn.nMaxFileTitle     = _MAX_FNAME + _MAX_EXT ;
  130.                ofn.lpstrDefExt       = "jpg" ;
  131.  
  132.            hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
  133.            lpfnECJ_CallBack    = MakeProcInstance ((FARPROC) ECJ_CallBack,
  134.                              hInstance);
  135.                return 0 ;
  136.            }
  137.  
  138.           case WM_SIZE:
  139.                cxClient = LOWORD (lParam) ;
  140.                cyClient = HIWORD (lParam) ;
  141.                return 0 ;
  142.  
  143.           case WM_COMMAND:
  144.                hMenu = GetMenu (hwnd) ;
  145.  
  146.                switch (wParam)
  147.                     {
  148.                     case IDM_OPEN:
  149.                          if (GetOpenFileName (&ofn))
  150.                               {
  151.                               if (lpDib != NULL)
  152.                                    GlobalFree (lpDib) ;
  153.  
  154.                   if (grey) attrib |= ECJ_GRAY_ONLY;
  155.                   if (auto_half) attrib |= ECJ_AUTO_HALF;
  156.                   else if (half) attrib |= ECJ_HALF_SIZE;
  157.                   if (two_pass) attrib |= ECJ_2_PASS;
  158.                   if (dither) attrib |= ECJ_DITHER;
  159.                   if (color_bits==24) attrib |= ECJ_24_BITS;
  160.  
  161.                               lpDib = ECJ_Decode (szFileName, attrib,
  162.                           0L, lpfnECJ_CallBack);
  163.                               if (lpDib == NULL)
  164.                                    MessageBox (hwnd, szAppName,
  165.                                                "Could not open JPG file",
  166.                                                MB_ICONEXCLAMATION | MB_OK) ;
  167.  
  168.                               InvalidateRect (hwnd, NULL, TRUE) ;
  169.                               }
  170.                          return 0 ;
  171.  
  172.                     case IDM_ACTUAL:
  173.                     case IDM_STRETCH:
  174.                          CheckMenuItem (hMenu, wDisplay, MF_UNCHECKED) ;
  175.                          wDisplay = wParam ;
  176.                          CheckMenuItem (hMenu, wDisplay, MF_CHECKED) ;
  177.  
  178.                          InvalidateRect (hwnd, NULL, TRUE) ;
  179.                          return 0 ;
  180.                     }
  181.                break ;
  182.  
  183.           case WM_PAINT:
  184.                hdc = BeginPaint (hwnd, &ps) ;
  185.  
  186.                if (lpDib != NULL)
  187.                     {
  188.             lpbi = (LPBITMAPINFOHEADER) GlobalLock(lpDib) ;
  189.  
  190.             if (hPalette)
  191.             {
  192.             SelectPalette (hdc, holdpal, FALSE) ;
  193.             DeleteObject (hPalette) ;
  194.             }
  195.                     hPalette = MakeDIBPalette (lpbi) ;
  196.                     holdpal = SelectPalette (hdc, hPalette, FALSE) ;
  197.                     RealizePalette (hdc) ;
  198.             
  199.                     lpDibBits = GetDibBits (lpbi) ;
  200.                     cxDib     = lpbi->biWidth ;
  201.                     cyDib     = lpbi->biHeight ;
  202.  
  203.                     SetStretchBltMode (hdc, COLORONCOLOR) ;
  204.  
  205.                     if (wDisplay == IDM_ACTUAL)
  206.                          SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0,
  207.                                             0, cyDib, (LPSTR) lpDibBits,
  208.                                             (LPBITMAPINFO) lpbi,
  209.                                             DIB_RGB_COLORS) ;
  210.  
  211.                     else
  212.                          StretchDIBits (hdc, 0, 0, cxClient, cyClient,
  213.                                         0, 0, cxDib, cyDib,
  214.                                         (LPSTR) lpDibBits,
  215.                                         (LPBITMAPINFO) lpbi,
  216.                                         DIB_RGB_COLORS, SRCCOPY) ;
  217.             GlobalUnlock (lpDib);
  218.                     }
  219.  
  220.                EndPaint (hwnd, &ps) ;
  221.                return 0 ;
  222.  
  223.           case WM_DESTROY:
  224.                if (lpDib != NULL)
  225.                     GlobalFree (lpDib) ;
  226.         hdc = GetDC(hwnd);
  227.         if (hPalette)
  228.             {
  229.             SelectPalette(hdc,holdpal,FALSE);
  230.             DeleteObject(hPalette);
  231.             hPalette = NULL;
  232.             }
  233.         ReleaseDC(hwnd,hdc);
  234.  
  235.                PostQuitMessage (0) ;
  236.                return 0 ;
  237.           }
  238.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  239.      }
  240.  
  241.  
  242. HPALETTE PASCAL NEAR MakeDIBPalette(LPBITMAPINFOHEADER lpInfo)
  243. {
  244.     NPLOGPALETTE npPal;
  245.     RGBQUAD far *lpRGB;
  246.     HPALETTE hLogPal; 
  247.     WORD i;
  248.  
  249.